package com.sky.controller.admin;

import cn.hutool.core.bean.BeanUtil;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.sky.dto.EmployeeDTO;
import com.sky.dto.EmployeeEditPasswordDto;
import com.sky.dto.EmployeeLoginDTO;
import com.sky.dto.EmployeePageQueryDTO;
import com.sky.entity.Employee;
import com.sky.result.Result;
import com.sky.service.EmployeeService;
import com.sky.utils.JwtUtil;
import com.sky.vo.EmployeeLoginVO;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletRequest;
import java.time.LocalDateTime;

/**
 * 员工管理
 */
@RestController
@RequestMapping("/admin/employee")
@Api(tags = "员工相关接口")
@Slf4j
public class EmployeeController {
    @Autowired
    EmployeeService employeeService;

    /**
     * 处理员工登录请求
     *
     * 该方法通过POST请求接收员工登录信息，并返回登录结果
     * 主要作用是验证员工身份，成功后返回员工登录视图对象
     *
     * @param dto 员工登录数据传输对象，包含登录所需的信息（如用户名和密码）
     * @return 返回登录结果，包括是否成功及员工登录视图对象
     */
    @PostMapping("/login")
    @ApiOperation("员工登录")
    public Result<EmployeeLoginVO> login(@RequestBody EmployeeLoginDTO dto) {
        //调用业务层，实现登录功能
        EmployeeLoginVO vo = employeeService.login(dto);
        return Result.success(vo);
    }

    /**
     * 处理员工信息分页查询请求
     *
     * @param dto 员工分页查询条件对象，包含页码、每页大小和查询条件等信息
     * @return 包含员工分页查询结果的响应对象
     */
    /**
     * 处理员工信息分页查询请求
     *
     * @param dto 员工分页查询条件对象，包含页码、每页大小和名称查询条件
     * @return 返回包含分页查询结果的响应对象
     */
    @GetMapping("/page")
    @ApiOperation("员工分页条件查询")
    public Result<Page<Employee>> page(EmployeePageQueryDTO dto) {
        // 创建分页对象，传入页码和每页大小
        Page<Employee> page = new Page<>(dto.getPage(), dto.getPageSize());

        // 调用员工服务的查询方法，并根据条件进行分页查询
        employeeService.query()
                // 如果名称查询条件不为空，则添加名称模糊查询条件
                .like(dto.getName() != null, "name", dto.getName())
                // 按创建时间降序排序
                .orderByDesc("create_time")
                // 执行分页查询
                .page(page);

        // 返回成功结果，包含分页查询结果
        return Result.success(page);
    }

    /**
     * 保存员工信息接口
     *
     * @param dto 员工数据传输对象，包含员工的基本信息
     * @return 返回保存操作的结果，不返回具体数据
     */
    @PostMapping
    @ApiOperation("添加并保存员工信息")
    public Result<Void> saveEmployee(@RequestBody EmployeeDTO dto){
        //将前端接收到的dto数据封装到employee类中
        Employee employee = BeanUtil.toBean(dto, Employee.class);

        //添加员工其他信息
        employee.setStatus(1);//状态：1启用 0禁用
        employee.setCreateTime(LocalDateTime.now());//创建时间
        employee.setUpdateTime(LocalDateTime.now());//更新时间
        employee.setPassword("123456");//设置默认密码：123456

        //调用业务层，保存员工信息
        employeeService.save(employee);

        //返回保存成功的结果
        return Result.success();
    }

    /**
     * 处理用户退出请求的控制器方法
     *
     * 该方法映射到"/logout"的POST请求，当用户请求退出时，它会返回一个表示成功登出的结果
     *
     * @return Result对象，表示用户已成功登出
     */
    @PostMapping("/logout")
    @ApiOperation("员工退出登录")
    public Result logout(){
        return Result.success();
    }

    /**
     * 根据员工ID获取员工信息
     *
     * @param id 员工ID，用于唯一标识一个员工
     * @return 返回一个Result对象，其中包含查询到的员工信息
     */
    @GetMapping("/{id}")
    @ApiOperation("根据员工id查询员工信息")
    public Result<Employee> getById(@PathVariable Long id){
        //调用业务层，根据id查询员工信息
        Employee employee = employeeService.getById(id);

        //返回查询结果
        return Result.success(employee);
    }

    /**
     * 更新员工信息
     *
     * 该方法接收一个EmployeeDTO对象，将其转换为Employee对象，并更新数据库中的对应记录
     * 主要涉及将DTO转换为实体对象、补全更新时间和调用服务层方法等步骤
     *
     * @param dto 包含员工更新信息的DTO对象
     * @return 返回一个表示操作结果的Result对象，包含操作状态和消息
     */
    @PutMapping
    @ApiOperation("修改员工信息")
    public Result<String> update(@RequestBody EmployeeDTO dto){
        //将dto对象封装成Employee对象
        Employee employee = BeanUtil.toBean(dto, Employee.class);

        //补全dto对象未有的数据
        employee.setUpdateTime(LocalDateTime.now());

        //调用业务层，更新员工信息
        employeeService.updateById(employee);

        return Result.success();
    }

    /**
     * 修改员工密码
     *
     * @param dto 包含旧密码和新密码的员工信息
     * @param request HTTP请求对象，用于获取请求头中的token
     * @return 修改密码的结果
     */
    @PutMapping("/editPassword")
    @ApiOperation("修改密码")
    public Result editPassword(@RequestBody EmployeeEditPasswordDto dto, HttpServletRequest request){
        //获取请求头信息token
        String token = request.getHeader("token");
        //从token中解析出员工ID
        Long empId = JwtUtil.parseJWT(token).get("empId", Long.class);

        //根据id查询员工信息
        Employee employee = employeeService.getById(empId);
        //验证旧密码是否正确
        if(!dto.getOldPassword().equals(employee.getPassword())){
            throw new RuntimeException("旧密码错误");
        }

        //修改新密码
        employeeService.update()
                .set("password",dto.getNewPassword())
                .eq("id",empId)
                .update();

        //返回结果
        return Result.success();
    }

    /**
     * 启用或停用员工
     *
     * @param status 员工状态，0代表停用，1代表启用
     * @param id 员工ID
     * @return 返回操作结果
     */
    @PostMapping("/status/{status}")
    @ApiOperation("启用或禁用员工")
    public Result startOrStop(@PathVariable Integer status,Long id){
        //调用业务层，修改员工状态
        employeeService.update()
                .eq("id",id)
                .set("status",status)
                .update();

        //返回结果
        return Result.success();
    }

}
